export class Tank {
  x: number = 0;
  y: number = 0;
  zidanSpeed: number = 20;
  protected name: string = "坦克";

  shoot() {
    console.log("发射子弹");
  }

  sayHello() {
    console.log("我是" + this.name);
  }
}

// 单根性：每个类最多只能拥有一个父类
// 传递性：如果A是B的父类，并且B是C的父类，那么可以认为A和C的父类
export class PlayerTank extends Tank {
  x: number = 20; // 子类中重新父类中的属性
  y: number = 20;
  protected name: string = "玩家坦克"; // 这里如果不写protected，会将父类的protected重写，外部就能够使用
  life: number = 5;

  shoot(): void {
    console.log("玩家坦克发射子弹");
  }

  sayHello(): void {
    console.log("abcd");
  }

  test() {
    // 只有发生重写时super，this有区别
    // super.sayHello();
    this.sayHello();
  }
}

export class EnemyTank extends Tank {
  name: string = "敌方坦克";
  health: number = 1;
}

export class BossTank extends EnemyTank {
  
}

// 子类的属性一定多余父类（鸭子类型兼容）
const p: Tank = new PlayerTank(); // p 只能使用Tank中的类型
console.log(p.x, p.y);
p.shoot();
p.sayHello();
if (p instanceof PlayerTank) {
  // 类型缩小
  console.log(p.life);
  p.test();
}
